package com.raising.modules.sys.dao;

import com.raising.framework.config.JConfig;
import com.raising.framework.spring.SpringUtils;
import com.raising.modules.sys.entity.Sessions;
import com.raising.modules.sys.service.SessionService;
import com.raising.utils.JStringUtils;
import com.raising.utils.SerializableUtils;
import com.raising.utils.ServletsUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.eis.CachingSessionDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;

/**
 * 自定义实现SessionDAO，实现session基于数据库层会话共享
 * 先从缓存中获取，找不到再从数据库获取
 * @author gaoy
 */
public class IDBSessionDAO extends CachingSessionDAO {

    @SuppressWarnings("unused")
	private static Logger logger = LoggerFactory.getLogger(IDBSessionDAO.class);

    /**
     * session服务
     */
    private SessionService sessionService = SpringUtils.getBean(SessionService.class);

    /**
     * Session更新
     * @param session
     */
    @Override
    protected void doUpdate(Session session) {
        if (session == null || session.getId() == null) {
            return;
        }
        HttpServletRequest request = ServletsUtils.getRequest();
        if (request != null) {
            String uri = request.getServletPath();
            // 如果是静态文件，则不更新SESSION
            if (ServletsUtils.isStaticFile(uri)) {
                return;
            }
            // 如果是视图文件，则不更新SESSION
            if (JStringUtils.startsWith(uri, JConfig.getConfig("web.view.prefix"))
                    && JStringUtils.endsWith(uri, JConfig.getConfig("web.view.suffix"))) {
                return;
            }
        }

//        /** 更新数据库或reids */
//        // 保存到数据库
//        Sessions dbSession = new Sessions();
//        //序列化Session
//        dbSession.setSession(SerializableUtils.serialize(session));
//        dbSession.setId(session.getId().toString());
//        try {
//            sessionService.update(dbSession);
//        }catch (Exception e){e.printStackTrace();}

    }

    /**
     * Session删除
     * @param session
     */
    @Override
    protected void doDelete(Session session) {
        if (session == null || session.getId() == null) {
            return;
        }
//        /** 删除 */
//        try {
//            //过期删除
//            sessionService.delete(session.getId().toString());
//        }catch (Exception e){e.printStackTrace();}
    }

    /**
     * Session创建
     * @param session
     * @return
     */
    @Override
    protected Serializable doCreate(Session session) {
        HttpServletRequest request = ServletsUtils.getRequest();
        if (request != null) {
            String uri = request.getServletPath();
            // 如果是静态文件，则不创建SESSION
            if (ServletsUtils.isStaticFile(uri)) {
                return null;
            }
        }
        //获取自定义 SessionID
        Serializable sessionId = generateSessionId(session);
        //设置SessionID
        assignSessionId(session, sessionId);

//        /** 入库或redis */
//        //保存到数据库
//        Sessions dbSession = new Sessions();
//        //序列化Session
//        dbSession.setSession(SerializableUtils.serialize(session));
//        dbSession.setId(session.getId().toString());
//        dbSession.setCreateDate(session.getStartTimestamp());
//        sessionService.add(dbSession);

        return session.getId();
    }

    /**
     * Session 读取
     * @param sessionId
     * @return
     */
    @Override
    protected Session doReadSession(Serializable sessionId) {
//        try {
//            Session session = null;
//            Sessions dbSession = sessionService.get(sessionId.toString());
//            if(dbSession!=null){
//                session = SerializableUtils.deserialize(dbSession.getSession());
//            }
//            return session;
//        }catch (Exception e){
//            e.printStackTrace();
//        }
        return null;
    }

}
